<?php
/**
 * Класс для обработки входных даныых $_POST, $_GET и пр.
 *
 * @author Александр Егоров <slamer@slamer.ru>
 * @author Дмитрий Кузьма <kouzma.d@slamer.ru>
 * @version 1.0
 */

class Service_Escape {
	/**
	 * Делает из многомерного массива безопасную для сохранения строку чисел по столбцу
	 *
	 * @param string $glue - разделитель
	 * @param array $arrToBeEscaped - многомерный массив, из которого и будет формироваться строка
	 * @param string $strPartName - название столбца, по которому будут браться числа
	 * @return string - безопасная строка
	 */
	public static function intEscapeJoinOfPart($glue, array $arrToBeEscaped, $strPartName) {
		$sizeOfArr = sizeof($arrToBeEscaped);
		if (!$sizeOfArr) return '';
		$retStr= '';
		for ($i=0; $i < $sizeOfArr; $i++) {
			if ($i) $retStr .= $glue . intval($arrToBeEscaped[$i][$strPartName]);
			else $retStr .= intval($arrToBeEscaped[$i][$strPartName]);
		}
		return $retStr;
	}
	
	/**
	 * Возвращает безопасную для сохранения в БД строку из массива, состоящую из чисел
	 *
	 * @param string $glue - разделитель
	 * @param string $arrToBeEscaped - массив, которые следует преобразовать к безопасной строке
	 * @return string - безопасная строка
	 */
	public static function intEscapeJoin($glue, array $arrToBeEscaped) {
		$sizeOfArr = sizeof($arrToBeEscaped);
		if (!$sizeOfArr) return '';
		$retStr= '';
		for ($i = 0; $i < $sizeOfArr; $i++) {
			if ($i) $retStr .= $glue . intval($arrToBeEscaped[$i]);
			else $retStr .= intval($arrToBeEscaped[$i]);
		}
		return $retStr;
	}
	
	/**
	 * Возвращает безопасную для сохранения в БД строку из массива (соединяются строки)
	 *
	 * @param string $glue - разделитель
	 * @param string $arrToBeEscaped - массив, которые следует преобразовать к безопасной строке
	 * @return string - безопасная строка
	 */
	public static function escapeJoin($glue, array $arrToBeEscaped) {
		$sizeOfArr = sizeof($arrToBeEscaped);
		if (!$sizeOfArr) return '';
		$retStr= '';

		for ($i = 0; $i < $sizeOfArr; $i++) {
			if ($i) $retStr .= $glue . self::escapeString($arrToBeEscaped[$i]);
			else $retStr .= self::escapeString($arrToBeEscaped[$i]);
		}
		return $retStr;
	}
	
	/**
	 * Возвращает безопасную для сохранения в БД строку из массива (соединяются строки)
	 *
	 * @param string $glue - разделитель
	 * @param string $arrToBeEscaped - массив, которые следует преобразовать к безопасной строке
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeJoin($glue, array $arrToBeEscaped) {
		$sizeOfArr = sizeof($arrToBeEscaped);
		if (!$sizeOfArr) return '';
		$retStr = '';

		for ($i = 0; $i < $sizeOfArr; $i++) {
			if ($i) $retStr .= $glue . self::absolutelyEscapeString($arrToBeEscaped[$i]);
			else $retStr .= self::absolutelyEscapeString($arrToBeEscaped[$i]);
		}
		return $retStr;
	}

	/**
	 * Возвращает безопасную для сохранения в БД строку (в том числе преобразовывает и теги)
	 *
	 * @param string $toBeEscaped - строка, которую следует сделать безопасной
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeString($toBeEscaped) {
		if (!is_string($toBeEscaped) && !is_numeric($toBeEscaped)) return '';
		$toBeEscaped = str_replace('\\', '\\\\', $toBeEscaped);
		if (!get_magic_quotes_gpc() ) {//&& !get_magic_quotes_runtime()
			return mysql_escape_string(htmlspecialchars($toBeEscaped));
		}
	  else {
	  	//echo '_' . $toBeEscaped . '=' . str_replace("'", "&#39;", htmlspecialchars($toBeEscaped)) . '<br />';
	    return str_replace("'", "&#39;", htmlspecialchars($toBeEscaped));
	  }
	}
	/**
	 * Возвращает безопасную для сохранения в БД строку (в том числе преобразовывает и теги)
	 *
	 * @param string $toBeEscaped - строка, которую следует сделать безопасной
	 * @return string - безопасная строка
	 */
	public static function escapeString($toBeEscaped) {
		if (!is_string($toBeEscaped)) return '';
		if (!get_magic_quotes_gpc() ) {//&& !get_magic_quotes_runtime()
			echo 123;
			return mysql_escape_string($toBeEscaped);
		}
	  else {
	  	return str_replace(array("'"), array("\\'"), $toBeEscaped);
	  }
	}

	/**
	 * Возвращает безопасный для сохранения в БД массив
	 *
	 * @param array $arrToBeEscaped - массив, который следует сделать безопасным
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeArraySavingHtml($arrToBeEscaped) {
		if (empty($arrToBeEscaped)) return $arrToBeEscaped;
		if (is_array($arrToBeEscaped)) {
		  foreach ($arrToBeEscaped as $key => $value) {
				if (is_array($value)) self::absolutelyEscapeArray($value);
				else $arrToBeEscaped[$key] = self::absolutelyEscapeStringSavingHtml($value);
			}
		}
		else $arrToBeEscaped = self::absolutelyEscapeStringSavingHtml($arrToBeEscaped);
		return $arrToBeEscaped;
	}

	/**
	 * Возвращает безопасный для сохранения в БД массив
	 *
	 * @param array $arrToBeEscaped - массив, который следует сделать безопасным
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeArray($arrToBeEscaped, $depth = 0) {
		if (empty($arrToBeEscaped)) return array();
		if (is_array($arrToBeEscaped)) {
		  foreach ($arrToBeEscaped as $key => $value) {
				if (is_array($value)) self::absolutelyEscapeArray($value, $depth + 1);
				else $arrToBeEscaped[$key] = self::absolutelyEscapeString($value);
			}
		}
		elseif ($depth == 0) $arrToBeEscaped = array();
		else $arrToBeEscaped = self::absolutelyEscapeString($arrToBeEscaped);
		return $arrToBeEscaped;
	}	
	
	/**
	 * Возвращает безопасный массив с целыми числами
	 *
	 * @param array $arrToBeEscaped - массив, который следует сделать безопасным
	 * @return array - "чистый" массив
	 */
	public static function intEscapeArray($arrToBeEscaped) {
		$sizeOfArr = sizeof($arrToBeEscaped);
		if (!$sizeOfArr) return '';
		for ($i = 0; $i < $sizeOfArr; $i++) $arrToBeEscaped[$i] = intval($arrToBeEscaped[$i]);
		return $arrToBeEscaped;
	}

	/**
	 * Возвращает безопасную для сохранения в БД строку (без преобразования тегов)
	 *
	 * @param string $toBeEscaped - строка, которую следует сделать безопасной
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeStringSavingHtml($toBeEscaped) {
	  if (!get_magic_quotes_gpc() && !get_magic_quotes_runtime()) {
	  	return mysql_escape_string($toBeEscaped);
	  }
	  else
	    //return $toBeEscaped;//addslashes($toBeEscaped);
	    return str_replace("'", "&#39;", $toBeEscaped);
	}
	
	/**
	 * Возвращает безопасную для сохранения в БД строку (с учетом обработки WYSYWYG редактором)
	 *
	 * @param string $toBeEscaped - строка, которую следует сделать безопасной
	 * @return string - безопасная строка
	 */
	public static function absolutelyEscapeStringFromWysiwyg($toBeEscaped) {
		return self::absolutelyEscapeStringSavingHtml(Service_Editor::parseHTML($toBeEscaped) );
	}
	
	/**
	 * Заменяем специальные символы на мнемоники
	 * @param $value - Строка в которой надо произвести замену
	 */
  public static function replaceSpecialChars($value) {
    $replaceFrom = array('²', '³', '×', 'Ø', '−', '±', '–', '—', '°', '½', '¼', '¾', '⅛', '«', '»', '…', '⅔', '⅜', '⅛', ' ');
    $replaceTo = array('&sup2;', '&sup3;', '&times;', '&Oslash;', '&minus;', '&plusmn;', '&ndash;', '&mdash;', '&deg;', '&frac12;', '&frac14;', '&frac34;', '&frac18;', '&laquo;', '&raquo;', '&hellip;', '&#8532;', '&#8540;', '&#8539;', '&nbsp;');
    return str_replace($replaceFrom, $replaceTo, $value);
  }	
  
  /**
   * Валидируем переменную типа int переданную через POST
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataInt($key, $method = 'POST', $default = 0) {
  	if ($method == 'POST') return isset($_POST[$key]) ? intval($_POST[$key]) : $default;
  	if ($method == 'GET') return isset($_GET[$key]) ? intval($_GET[$key]) : $default;
  	if ($method == 'COOKIE') return isset($_COOKIE[$key]) ? intval($_COOKIE[$key]) : $default;
  	else return $default;	
  }
  /**
   * Валидируем переменную типа float переданную через POST
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataFloat($key, $method = 'POST', $default = 0) {
  	return self::requestDataStringRegExp($key, '#(-)?[0-9]+(\.[0-9]+)?#', $method, $default);
  }
  
  /**
   * Валидируем переменную типа bool переданную через POST
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataBool($key, $method = 'POST', $default = false) {
  	if ($method == 'POST') return isset($_POST[$key]) ? (($_POST[$key] === true || $_POST[$key] == 'true') ? true : false) : $default;
  	if ($method == 'GET') return isset($_GET[$key]) ? (($_GET[$key] === true || $_POST[$key] == 'true') ? true : false) : $default;
  	if ($method == 'COOKIE') return isset($_COOKIE[$key]) ? (($_COOKIE[$key] === true || $_POST[$key] == 'true') ? true : false) : $default;
  	else return $default;	
  }
  
  /**
   * Валидируем переменную типа string переданную через POST
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataString($key, $method = 'POST', $default = '') {
  	if ($method == 'POST') return isset($_POST[$key]) ? self::absolutelyEscapeString($_POST[$key]) : $default;
  	if ($method == 'GET') return isset($_GET[$key]) ? self::absolutelyEscapeString($_GET[$key]) : $default;
  	if ($method == 'COOKIE') return isset($_COOKIE[$key]) ? self::absolutelyEscapeString($_COOKIE[$key]) : $default;
  	else return $default;	
  }
  
  /**
   * Валидируем переменную типа string переданную через POST, с использованием регулярного выражения
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataStringRegExp($key, $regExp, $method = 'POST', $default = '') {
  	if ($method == 'POST') return (isset($_POST[$key]) && preg_match($regExp, $_POST[$key])) ? self::absolutelyEscapeString($_POST[$key]) : $default;
  	if ($method == 'GET') return (isset($_GET[$key]) && preg_match($regExp, $_GET[$key])) ? self::absolutelyEscapeString($_GET[$key]) : $default;
  	if ($method == 'COOKIE') return (isset($_COOKIE[$key]) && preg_match($regExp, $_COOKIE[$key])) ? self::absolutelyEscapeString($_COOKIE[$key]) : $default;
  	else return $default;	
  }
  
  /**
   * Валидируем переменную типа array переданную через POST
   * 
   * @param string $key - ключ в массиве $_POST
   */
  public static function requestDataArray($key, $method = 'POST', $default = array()) {
  	if ($method == 'POST') return isset($_POST[$key]) ? self::absolutelyEscapeArray($_POST[$key]) : $default;
  	if ($method == 'GET') return isset($_GET[$key]) ? self::absolutelyEscapeArray($_GET[$key]) : $default;
  	if ($method == 'COOKIE') return isset($_COOKIE[$key]) ? self::absolutelyEscapeArray($_COOKIE[$key]) : $default;
  	else return $default;	
  }  

  /**
   * Проверяет является ли хоть один из переданных параметров пустым
   * 
   * @return bool - Если есть пустые - true, если нет - false
   */
  public static function isAnyEmpty() {
  	$args = func_get_args();
  	foreach ($args as $arg) {
  		if (empty($arg)) return true;
  	}
  	return false;
  }
  
}
?>